#include "AltaCheque.h"
#include "ui_AltaCheques.h"

extern QSqlDatabase enjoylifedb;
extern QSqlRelationalTableModel *cheques_model;
extern QTableView *cheques_view;
extern QSqlRelationalTableModel  *movimientos_model;

AltaCheque::AltaCheque(QWidget *parent) :
    QWidget(parent),
    cheq2_model(new QSqlRelationalTableModel(this)),
    ui(new Ui::AltaCheques)
{
    ui->setupUi(this);
    setWindowFlags(Qt::WindowMinimizeButtonHint);
    setWindowFlags(Qt::WindowCloseButtonHint);
    setWindowTitle("Alta Cheques");
    setWindowModality(Qt::WindowModal);

    cheq2_model->setTable("cheque");

    CargarPersonas();
    CargarConceptos();

    ui->comboBox_Persona->setFocus();
    QDate date;
    ui->fecha_recibido->setDate(date.currentDate());
    ui->fecha_cobro->setDate(date.currentDate());

    connect(ui->guardarBtn,SIGNAL(clicked()),this,SLOT(GuardarBtn()));
    connect(ui->cerrarBtn,SIGNAL(clicked()),this,SLOT(CerrarBtn()));

    // Definición de acceso directo para guardar cambios.".
    QShortcut* shortcutGuardar = new QShortcut(QKeySequence(Qt::Key_Return), this);
    connect(shortcutGuardar, SIGNAL(activated()), this, SLOT(GuardarBtn()));
    // Definición de acceso directo para Cancelar cambios.".
    QShortcut* shortcutCancelar = new QShortcut(QKeySequence(Qt::Key_Escape), this);
    connect(shortcutCancelar, SIGNAL(activated()), this, SLOT(close()));
}

AltaCheque::~AltaCheque()
{
    delete ui;
}

/**
 * @brief CargarPersonas
 * Carga personas en el combobox
 */
void AltaCheque::CargarPersonas()
{
    // Carga las personas de la pabla persona
    QSqlQuery *query2 = new QSqlQuery(enjoylifedb);
    QString stm2= "select persona from persona where estado is null or estado <> 'BAJA' order by persona";

    if (! query2->exec(stm2)) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, "
                              "intentelo manualmente || " + query2->lastError().text());
        return;
    }
    ui->comboBox_Persona->addItem("");
    while (query2->next()) {
        ui->comboBox_Persona->addItem(query2->value(query2->record().indexOf("persona")).toString());
    }
}

/**
 * @brief AltaCheque::CargarConceptos
 * Carga conceptos en el combobox
 */
void AltaCheque::CargarConceptos()
{
    // Carga las personas de la pabla cliente
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString stm = "select concepto from concepto where tipo_concepto = 'Cliente' order by concepto";

    if (! query->exec(stm)) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros de conceptos, "
                              "intentelo nuevamente || " + query->lastError().text());
        return;
    }
    ui->comboBox_concepto->addItem("");
    while (query->next()) {
        ui->comboBox_concepto->addItem(query->value(query->record().indexOf("concepto")).toString());
    }
}

/**
 * @brief AltaCheque::CerrarBtn
 */
void AltaCheque::CerrarBtn()
{
    close();
}

/*
 * Acción del boton Guardar.
 */
void AltaCheque::GuardarBtn()
{
    if (ui->comboBox_Persona->itemText(ui->comboBox_Persona->currentIndex()).isEmpty()) {
        QMessageBox::critical(this,"Agregar Cheque",
                              "Advertencia! Debe ingresar un valor para la Persona");
        return;
    }
    if (ui->comboBox_concepto->itemText(ui->comboBox_concepto->currentIndex()).isEmpty()) {
        QMessageBox::critical(this,"Agregar Cheque",
                              "Advertencia! Debe ingresar un valor para el Concepto");
        return;
    }
    if (ui->nroCheque->text().isEmpty()) {
        QMessageBox::critical(this,"Agregar Cheque",
                              "Advertencia! Debe ingresar un valor para el Nro. Cheque");
        return;
    }
    if (ui->banco->text().isEmpty()) {
        QMessageBox::critical(this,"Agregar Cheque",
                              "Advertencia! Debe ingresar un valor para el Banco");
        return;
    }
    if (ui->monto->text().isEmpty()) {
        QMessageBox::critical(this,"Agregar Cheque",
                              "Advertencia! Debe ingresar un valor para el Monto");
        return;
    }

    // Record para cheque
    QSqlRecord record;
    // Se agrega la persona
    QSqlField cpersonaField(QStringLiteral("c_persona"), QVariant::String);
    cpersonaField.setValue(ui->comboBox_Persona->itemText(ui->comboBox_Persona->currentIndex()));
    record.append(cpersonaField);
    // Se agrega el concepto
    QSqlField cconceptoField(QStringLiteral("c_concepto"), QVariant::String);
    cconceptoField.setValue(ui->comboBox_concepto->itemText(ui->comboBox_concepto->currentIndex()));
    record.append(cconceptoField);
    // Se agrega la fecha de recibido
    QSqlField frecibidoField(QStringLiteral("fecha_recibido"), QVariant::Date);
    frecibidoField.setValue(ui->fecha_recibido->text());
    record.append(frecibidoField);
    // Se agrega la fecha de cobro
    QSqlField fcobroField(QStringLiteral("fecha_cobro"), QVariant::Date);
    fcobroField.setValue(ui->fecha_cobro->text());
    record.append(fcobroField);
    // Se agrega el monto
    QSqlField montoField(QStringLiteral("monto"), QVariant::Double);
    montoField.setValue(ui->monto->text().toFloat());
    record.append(montoField);
    // Se agrega el nro. cheque
    QSqlField nroCField(QStringLiteral("nro_cheque"), QVariant::String);
    nroCField.setValue(ui->nroCheque->text());
    record.append(nroCField);
    QSqlField bancoCField(QStringLiteral("banco"), QVariant::String);
    bancoCField.setValue(ui->banco->text());
    record.append(bancoCField);

    enjoylifedb.transaction();
    // Se ingresa el cheque
    if (!(cheques_model->insertRecord(-1, record))) {
        QString error = cheques_model->lastError().text();
        QMessageBox::critical(this,"Error!", tr("No se pudo insertar el cheque, intentelo de nuevo."
                                                "\n %1").arg(error));
        enjoylifedb.rollback();
        return;
    }

    enjoylifedb.commit();

    SelectCheques();
    CorrectViewOfModel();
    ResetUi();
}

/*
 * Actualiza el listado de cheques.
 */
void AltaCheque::SelectCheques()
{
    cheques_model->setTable("cheque");
    enjoylifedb.transaction();
    if (!cheques_model->select()) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
}

/*
 * Resetea los valores de la Ui.
 */
void AltaCheque::ResetUi()
{
    ui->comboBox_Persona->setCurrentIndex(0);
    ui->comboBox_concepto->setCurrentIndex(0);
    QDate date;
    ui->fecha_recibido->setDate(date.currentDate());
    ui->fecha_cobro->setDate(date.currentDate());
    ui->monto->setText("0.00");
    ui->nroCheque->clear();
    ui->banco->clear();
}

/*
 * Acomoda la vista del modulo Movimientos.
 */
void AltaCheque::CorrectViewOfModel()
{
    cheques_model->setHeaderData(0,Qt::Horizontal,"ID Cheque");
    cheques_model->setHeaderData(1,Qt::Horizontal,"Nro. Cheque");
    cheques_model->setHeaderData(2,Qt::Horizontal,"Banco");
    cheques_model->setHeaderData(3,Qt::Horizontal,"Fecha Recibido");
    cheques_model->setHeaderData(4,Qt::Horizontal,"Fecha Cobro");
    cheques_model->setHeaderData(5,Qt::Horizontal,"Persona");
    cheques_model->setHeaderData(6,Qt::Horizontal,"Concepto");
    cheques_model->setHeaderData(7,Qt::Horizontal,"Monto");

    cheques_view->setModel(cheques_model);
    cheques_view->setCornerButtonEnabled(true);
    cheques_view->setAlternatingRowColors(true);
    cheques_view->setGridStyle(Qt::SolidLine);
    cheques_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    cheques_view->setWordWrap(true);
    cheques_view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    cheques_view->sortByColumn(1,Qt::SortOrder());
    cheques_view->hideColumn(8);

//    cheques_view->setColumnWidth(0,90);
//    cheques_view->setColumnWidth(1,90);
//    cheques_view->setColumnWidth(2,90);
//    cheques_view->setColumnWidth(3,330);
//    cheques_view->setColumnWidth(4,330);
//    cheques_view->setColumnWidth(5,100);
    cheques_view->scrollToBottom();
}
